package _go

import "fmt"

/*445. 两数相加 II
难度
中等

401

收藏

分享
切换为英文
接收动态
反馈
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外，这两个数字都不会以零开头。



进阶：

如果输入链表不能修改该如何处理？换句话说，你不能对列表中的节点进行翻转。



示例：

输入：(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出：7 -> 8 -> 0 -> 7
通过次数73,688提交次数125,983
*/
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}

	aryl1, aryl2 := []int{}, []int{}
	//l1 入栈
	for l1 != nil {
		aryl1 = append(aryl1, l1.Val)
		l1 = l1.Next
	}
	//ll2 入栈
	for l2 != nil {
		aryl2 = append(aryl2, l2.Val)
		l2 = l2.Next
	}
	fmt.Printf("l1 %v l2 %v", aryl1, aryl2)

	//从后往前取值 模拟栈操作
	len1, len2, lenH := len(aryl1), len(aryl2), 0
	if len1 > len2 {
		lenH = len1
	} else {
		lenH = len2
	}
	//进位
	f := 0
	var res *ListNode
	for i := 0; i < lenH; i++ {
		tmpl1 := 0
		if len(aryl1)-i-1 >= 0 {
			tmpl1 = aryl1[len(aryl1)-i-1]
		}
		tmpl2 := 0
		if len(aryl2)-i-1 >= 0 {
			tmpl2 = aryl2[len(aryl2)-i-1]
		}
		newVal := (f + tmpl1 + tmpl2) % 10
		f = (f + tmpl1 + tmpl2) / 10

		node := ListNode{Val: newVal, Next: nil}
		if res == nil {
			res = &node
		} else {
			node.Next = res
			res = &node
		}
		//  fmt.Printf("new %d \n",newVal)
	}
	if f != 0 {
		nore := &ListNode{Val: f, Next: nil}
		nore.Next = res
		res = nore
	}

	return res
}
